package com.xuecheng.content.mapper;

import com.xuecheng.common.enums.content.TeachPlanEnum;
import com.xuecheng.common.util.JsonUtil;
import com.xuecheng.content.entity.ex.TeachplanNode;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.ObjectUtils;

import java.util.ArrayList;
import java.util.List;

@SpringBootTest
@RunWith(SpringRunner.class)
public class TreeNodeTset {

    @Autowired
    private TeachplanMapper mapper;

    @Test
    public void testTreeNode() {

        // 1.根据课程基础信息id获得一门课下的所有课程计划
        List<TeachplanNode> teachplanNodes = mapper.selectTreeNodesByCourseBaseId(28l);
        // 2.遍历集合数据生成树形结构内容
        // 说明：课程计划为3级，mapper查询后，一级课程计划为list中的第一条

        // remove将指定下表的数据删除并返回，nodes中只有二级和三级的数据
        TeachplanNode rootNode = teachplanNodes.remove(0);


        // 通过java的递归方式来生成课程计划的树形结构
        /*
         * 方法：
         *   参数：
         *       1.父节点的数据
         *       2.二级和三级的课程计划list数据
         * */

        generateTreeNode(rootNode, teachplanNodes);
        System.out.println(JsonUtil.objectTojson(rootNode));
    }

    /*
     *  生成树形结构数据
     * */
    private void generateTreeNode(TeachplanNode prentNode, List<TeachplanNode> nodes) {

        // 1.判断父节点的集合数据是否为空
        if (ObjectUtils.isEmpty(prentNode.getChildrenNodes())) {
            prentNode.setChildrenNodes(new ArrayList<TeachplanNode>());
        }
        // 2.遍历集合数据生成树形结构的内容
        for (TeachplanNode node : nodes) {
            // 判断node的parentid是否和parentNode里的id值是否一致，如果一致，
            if (ObjectUtils.nullSafeEquals(node.getParentid(), prentNode.getId())) {
                // 将node存放到parentNode对象集合数据中
                prentNode.getChildrenNodes().add(node);
                // 循环递归方法来生成其他级别的树形结构数据
                if (!TeachPlanEnum.THIRD_LEVEL.equals(node.getGrade())) {
                    generateTreeNode(node,nodes);
                }
            }
        }

    }
}
